C++ const面试题和相关的解释

您所在的位置:网站首页 指针 面试 C++ const面试题和相关的解释

C++ const面试题和相关的解释

2023-09-18 22:46| 来源: 网络整理| 查看: 265

问题:如果函数需要传入一个指针,面试官可能会问是否需要为该指针加上const,把const加在指针不同位置有什么区别;如果写的函数需要传入的参数是一个复杂类型的实例,面试官可能会问传入值参数或者引用参数有什么区别,什么时候需要为传入的引用参数加上const?

(1)const是用来声明一个常量的,当你不想让一个值改变时就用const。

当const修饰指针时:

     int b=100;

     const int*a=&b;    [1]

     int const *a=&b;   [2]

     int* const a=&b;   [3 ]

     const  int* const  a=&b;  [4]

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a=3;

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量,[3]为指针本身是常量,而指针所指向的内容不是常量,。这种情况下不能对指针本身更改操作,如a++是错误的;

[4]为指针本身和指向的内容均为常量。

(2)用const修饰函数的输入参数。

      第一,对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用,目的提高效率”。例如将void Func(A a)改为voidFun(const A&a)。第二,对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到高效率的目的,有降低了函数的可理解性。例如void Func(int x)不应该改为void Func(const int&x)。

(3)const修饰函数的返回值。

    第一,如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数

    const char*GetString(void);

 如下语句将出现编译错误:

char*str=GetString();

正确的用法是:

const char*str=GetString();

第二,如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。

第三,函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。例如:

class A

{

A&operate=(const  A&other);//赋值函数

};

A a,b,c;//a,b,c为A的对象

.....

a=b=c;//正常的链式赋值

(a=b)=c;//不正常的链式赋值,但合法

如果将赋值函数的返回值加const修饰,那么该返回值的内容不允许被改动。上例中,语句a=b=c仍然正确,但是语句(a=b)=c则是非法的。

3、const修饰成员函数

任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。一下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。

class Stack

{

public:

void Push(int elem);

int Pop(void);

int GetCount(void)const;//const成员函数,const只能放在函数的尾部

private:

int m_num;

int m_data[100];

};

int Stack::GetCount(void)count

{

++m_num;

Pop();

return m_num;

}

const 成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。

char greeting[]="Hello";

char *p=greeting;//non-const pointer,non-const data

const char*p=greeting;//non-const pointer,const data

char*const p=greeting;//const pointer,non-const data

const char*const p=greeting;//const pointer,const data

1.解释下面ptr含义和不同

double*ptr=&value;//ptr是一个指向double类型的指针,ptr的值可以改变,ptr所指向的value的值也可以改变

const double*ptr=&value//ptr是一个指向const double类型的指针,ptr的值可以改变,ptr所指向的value的值不可以改变

double*const ptr=&value//ptr是一个指向double类型的指针,ptr的值不可以改变,ptr所指向的value的值可以改变

const double*const ptr=&value//ptr是一个指向const double类型的指针,ptr的值不可以改变,ptr所指向的value也不可以改变

2.去掉const属性,例:const double value=0.0f;double*ptr=NULL;怎么才能让ptr指向value?

强制类型转换,去掉const属性,如ptr=《const_cast double*>(&value);



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3